﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;

namespace mrp16062010
{
    [JsonObject(IsReference = true)]
    class IsParcasi
    {
        public int Id { get; set; }
        public Rota.Operasyon Op;
        private DateTime basTarihi;

        public DateTime BasTarihi
        {
            get { 
                
                return basTarihi; 
            
            }
            set
            {
                if (value.Hour==3)
                {
                    
                }
                basTarihi = value; 
            }
            
        }
        
        public DateTime BitTarihi;

        private Simulation.Bilgi simulasyonBilgisi ;

        public Simulation.Bilgi SimulasyonBilgisi 
        {
            get {
                if (simulasyonBilgisi==null)
                {
                    simulasyonBilgisi = new Simulation.Bilgi();
                }
                return simulasyonBilgisi ; }
            set { simulasyonBilgisi  = value; }
        }

        private int parcaAdedi;

        public int ParcaAdedi
        {
            get { return parcaAdedi; }
        }
        

        private TimeSpan uzunluk;

        public TimeSpan Uzunluk
        {
            get { return uzunluk; }
            set { uzunluk = value; }
        }

        private TimeSpan islenen;

        public TimeSpan Islenen
        {
            get { return islenen; }
            set { islenen = value; }
        }
        

        public IsMerkezi IM
        {
            get
            {
                if (Op != null)
                { return Op.IsMerkeziRota; }
                return null;
            }
        }

        public CizelgeIsMerkezi IsMerkeziCizelge { get; set; }

        public IsMerkezi TatilIsMerkezi { get; set; }

        public void CizelgedenCikar()
        {
            if (IsMerkeziCizelge!=null)
            {
                IsMerkeziCizelge.IsListe.Remove(this);
                
            }
        }

        public List<Stok> GirenStokList
        {
            get {
                if (Op!=null)
                {
                   return Op.GirenStokList; 
                }
                return null;
                 }
        }
        public Stok OlusanStok
        {
            get {
                if (Op!=null)
                {
                  return Op.OlusanStok;  
                }
                return null;
                 }
        }
        public TimeSpan HazirlikSuresi
        {
            get {
                if (Op!=null)
                {
                    return Op.HazirlikSuresi;
                }
                return new TimeSpan();
                 }
        }
        private Kaydedici kaydet = new Kaydedici();

        public Kaydedici Kaydet
        {
            get { return kaydet; }
            set { kaydet = value; }
        }

        private Siparis siparisBilgi;

        public Siparis SiparisBilgi
        {
            get { return siparisBilgi; }
            set { siparisBilgi = value; }
        }

        private bool tatilMi;

        public bool TatilMi
        {
            get { return tatilMi; }
            set { tatilMi = value; }
        }
        
        private bool uzadiMi;

        public bool UzadiMi
        {
            get { return uzadiMi; }
            set { uzadiMi = value; }
        }

        private TimeSpan uzamaMiktari;

        public TimeSpan UzamaMiktari
        {
            get { return uzamaMiktari; }
            set { uzamaMiktari = value; }
        }

        private bool yuklemeTipi;

        public bool YuklemeTipi
        {
            get { return yuklemeTipi; }
            set { yuklemeTipi = value; }
        }
        

        public bool Uzat(TimeSpan miktar)
        {

            this.uzadiMi = true;
            this.uzamaMiktari += miktar;
            if (miktar.Ticks > 0)//Eğer ileri yüklemeyse
            {
                this.BitTarihi = this.BitTarihi + miktar;
            }
            else
            {
                //if (this.SiparisBilgi.TarihBilgisi.BaslangicTarihi > (this.BasTarihi - (-miktar)))
                //{
                //    //Şimdiden geriye düştüyse false döndür
                //    return false;
                //}
                //else
                //{
                    this.BasTarihi = this.BasTarihi - (-miktar);
                //}

            }
            return true;
        }

        public void UzatmayiGeriAl()
        {
            this.uzadiMi = false;
            if (uzamaMiktari.Ticks > 0)//Eğer ileri yüklemeyse
            {
                this.BitTarihi = this.BitTarihi - this.uzamaMiktari;
            }
            else
            {
                this.BasTarihi = this.BasTarihi - (-this.uzamaMiktari);
            }
            uzamaMiktari = TimeSpan.Zero;
        }

        public void IleriHesapla(DateTime BasTarih)
        {
            BasTarihi = BasTarih;
            int toplamAdet = Op.Rota.ToplamUretilecekAdet(siparisBilgi.Adet);
            TimeSpan toplamOpSuresi = TimeSpan.FromTicks(Op.Sure.Ticks * ((long)toplamAdet));
            BitTarihi = BasTarihi+HazirlikSuresi+toplamOpSuresi;
        }

        public void GeriHesapla(DateTime BitTarih)
        {
            BitTarihi = BitTarih;
            int toplamAdet = Op.Rota.ToplamUretilecekAdet(siparisBilgi.Adet);
            TimeSpan toplamOpSuresi = TimeSpan.FromTicks(Op.Sure.Ticks * ((long)toplamAdet));
            BasTarihi = BitTarihi-HazirlikSuresi-toplamOpSuresi;
        }

        public IsParcasi()
        {

        }

        public IsParcasi(Rota.Operasyon OperasyonGelen, Siparis siparis)
        {
            kaydet.IsKaydet = false;
            Op = OperasyonGelen;
            siparisBilgi = siparis;
            parcaAdedi = Op.Rota.ToplamUretilecekAdet(siparisBilgi.Adet);
        }

        public IsParcasi(DateTime baslangic, DateTime bitis)//Tatil için
        {
            kaydet.IsKaydet = true;//Tatiller silinmeyecek
            this.BasTarihi = baslangic;
            this.BitTarihi = bitis;
        }

        private IsParcasi onundekiIsParcasi;

        public IsParcasi OnundekiIsParcasi
        {
            get { return onundekiIsParcasi; }
            set { onundekiIsParcasi = value; }
        }

        private List<IsParcasi> arkasindakiIsParcalari = new List<IsParcasi>();

        public List<IsParcasi> ArkasindakiIsParcalari
        {
            get { return arkasindakiIsParcalari; }
            set { arkasindakiIsParcalari = value; }
        }
        //Similasyonda bu iş parçasının devam edebilmesi için beklediği parçalar hazır mı?
        public bool HazirMi
        {
            get
            {
                if (arkasindakiIsParcalari.Except(bitenParcalar).Count() == 0)
                {
                    return true;
                }
                return false;
            }
        }

        List<IsParcasi> bitenParcalar = new List<IsParcasi>();

        public void parcaBitti(IsParcasi gelen)
        {
            if (!bitenParcalar.Contains(gelen))
            {
                bitenParcalar.Add(gelen);
            }
               
        }
        //Bu operasyon ve bundan sonraki operasyonların sayısını verir

        public int IslenecekOperasyonSayisi()
        {
                if (this.TatilMi)
                {
                    return 0;
                }
                return IslenecekOperasyonlar().Count;
        }


        public TimeSpan IslenecekOperasyonSuresi()
        {
            if (this.TatilMi)
            {
                return new TimeSpan();
            }
            TimeSpan toplam = new TimeSpan();
            foreach (Rota.Operasyon item in IslenecekOperasyonlar())
            {
                toplam += item.Sure;
            }
            return toplam;

        }
        

        private List<Rota.Operasyon> IslenecekOperasyonlar()
        {
            if (this.TatilMi)
            {
                return new List<Rota.Operasyon>();
            }
            List<Rota.Operasyon> islenecekler = (from x in this.Op.Rota.OperasyonList
                                                 where x.Sira >= this.Op.Sira
                                                 orderby x.Sira ascending
                                                 select x).ToList<Rota.Operasyon>();
            return islenecekler;
        }

        public double KritikOran { get; set; }
        
        public IsParcasi RotaninSonParcasi
        {
            get { 
                 IsParcasi eldeki = this;
                foreach (Rota.Operasyon op in this.IslenecekOperasyonlar())
                {
                    if (eldeki.RotaninSonuMu)
                    {
                        return eldeki;
                    }
                    else
                    {
                        eldeki = eldeki.OnundekiIsParcasi;
                    }
                }
                return eldeki; }
        }
        


        public bool RotaninSonuMu
        {
            get
            {
                if (this.tatilMi)
                {
                    return true;
                }
                if (this.Op.Sira == this.Op.Rota.OperasyonList.Last().Sira)
                {
                    return true;
                }
                return false;
            }
        }
        
    }
}
